package com.cw.lang.validator.constraints;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import com.cw.lang.validator.constraintvalidators.CheckWithValidator;
import com.cw.lang.validator.constraintvalidators.DefaultSimpleCheck;
import com.cw.lang.validator.constraintvalidators.SimpleCheck;
import com.cw.lang.validator.constants.ValidatorConstants;

/**
 * 如果一个校验需要使用一个对象下的多个字段，则需要把这个注解加在对象上，而非字段上，否则拿不到另外字段值
 *
 * @author chenw
 * @version $$Id: CheckWith.java, v 0.1 2018/9/20 下午1:35 chenw Exp $$
 */
@Constraint(validatedBy = CheckWithValidator.class)
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(CheckWithList.class)
public @interface CheckWith {

    /**
     * 自定义校验器的实现类
     *
     * @return 自定义校验器的实现类
     */
    Class<? extends SimpleCheck> value() default DefaultSimpleCheck.class;

    /**
     * 多个校验器
     *
     * @return 校验器
     */
    Validator[] checker() default {};

    /**
     * 校验失败给出的异常描述
     *
     * @return 异常描述
     */
    String message() default ValidatorConstants.CHECK_WITH_DEFAULT_MESSAGE;

    /**
     * 分组
     *
     * @return 分组
     */
    Class<?>[] groups() default {};

    /**
     * payload
     *
     * @return payload
     */
    Class<? extends Payload>[] payload() default {};
}
